package com.rzhd.coursepatriarch.common.utils;

import android.content.Context;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.ProgressBar;

import java.util.HashMap;

/**
 * @author yql
 * Time: 2018/5/21.
 */

public class WebViewHelper {

    private final String TAG = getClass().getSimpleName();

    /**
     * 上下文对象
     */
    private Context mContext;

    /**
     * Alert弹窗
     */
    private WebHelperOnJsAlert mHelperOnJsAlert;

    /**
     * WebView对象
     */
    private WebView mWebView;

    /**
     * 进度条
     */
    private ProgressBar mProgressBar;

    /**
     * 加载指定的URL
     */
    private String url;
    /**
     * 是否需要进行网络判断
     */
    private boolean isNeedCheckNet = true;

    public WebViewHelper(Context context, WebView webView) {
        this( context , webView , true );
    }

    public WebViewHelper(Context context, WebView webView , boolean isCloseCopy ) {
        this.mContext = context;
        this.mWebView = webView;
        initSetting();
    }

    public WebViewHelper(Context context, WebView webView, ProgressBar progressBar) {
        this.mContext = context;
        this.mWebView = webView;
        this.mProgressBar = progressBar;
        initSetting();
    }

    /**
     * WebView 设置
     */
    public void initSetting() {
        mWebView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return true;
            }
        });
        //从Android5.0开始，WebView默认不支持同时加载Https和Http混合模式。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(
                    WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
        }
        /**
         * 启用mixed content    android 5.0以上默认不支持Mixed Content
         *
         * 5.0以上允许加载http和https混合的页面(5.0以下默认允许，5.0+默认禁止)
         * */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        //解决Didn't find class "android.webkit.SafeBrowsingResponse"问题-----Android 8.0以上的问题
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            mWebView.getSettings().setSafeBrowsingEnabled(false);
//        }


        WebSettings settings = mWebView.getSettings();
        settings.setJavaScriptEnabled(true);//是否允许执行js，默认为false。设置true时，会提醒可能造成XSS漏洞
        settings.setAppCacheEnabled(false);//是否使用缓存
        settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        settings.setDomStorageEnabled(true);//设置存储路径
        settings.setSupportZoom(false);//不支持页面缩放
        mWebView.setVerticalScrollBarEnabled(false);//去掉竖直方向上的scrollbar
        mWebView.setHorizontalScrollBarEnabled(false);//去掉水平方向上的scrollbar
//        mWebView.getSettings().setGeolocationEnabled(true); //设置定位的数据库路径
//        mWebView.getSettings().setSupportMultipleWindows(true);//WebView默人不支持新窗口
//        mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically (true);//支持通过JS打开新窗口
    }

    /**
     * 加载网页
     *
     * @param url 网页地址
     */
    public void loadUrl(String url) {
        this.url = url;
        Log.v(TAG, url+"");
        //===========================2019-10-29新增isNeedCheckNet判断
        if ( !isNeedCheckNet || NetworkMyUtil.getInstance(mContext).isHaveNetWork() ) {
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.loadUrl(url);
        } else {
            mWebView.loadUrl("file:///android_asset/req_err.html");
//            mWebView.addJavascriptInterface(new WebAppInterface(), "Android");
        }
    }

    /**
     * @param url
     * @param map
     */
    public void loadUrl(String url, HashMap<String, String> map) {
        this.url = url;
        if (NetworkMyUtil.getInstance(mContext).isHaveNetWork()) {
            mWebView.getSettings().setJavaScriptEnabled(true);
            mWebView.loadUrl(url, map);
        } else {
            mWebView.loadUrl("file:///android_asset/req_err.html");
//            mWebView.addJavascriptInterface(new WebAppInterface(), "Android");
        }
    }

    /**
     * 加载html文本内容（富文本形式）
     *
     * @param baseUrl    默认为null
     * @param data       加载的数据源
     * @param mimeType   text/html
     * @param encoding   utf-8
     * @param historyUrl 默认为null
     */
    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) {
        mWebView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
    }

    /**
     * 辅助WebView处理Javascript的对话框、网站图标、网站title、加载进度等
     */
    public void setWebChromeClient() {
        mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress == 100 && mProgressBar != null) {
                    //加载网页完成后消失
                    mProgressBar.setVisibility(View.GONE);
                } else if (newProgress != 100 && mProgressBar != null) {
                    mProgressBar.setVisibility(View.VISIBLE);
                    mProgressBar.setProgress(newProgress);
                }
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                if (mHelperOnJsAlert != null)
                    mHelperOnJsAlert.onJsAlert(view, url, message, result);
                result.confirm();// 因为没有绑定事件，需要强行confirm,否则页面会变黑显示不了内容。
                return true;
            }

            @Override
            public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                result.confirm();
                return super.onJsConfirm(view, url, message, result);
            }
        });
    }

    public interface WebHelperOnJsAlert {
        //处理alert弹出框
        void onJsAlert(WebView view, String url, String message, JsResult result);
    }

    /**
     * 设置 Alert弹窗回调
     *
     * @param helperOnJsAlert
     */
    public void setHelperOnJsAlert(WebHelperOnJsAlert helperOnJsAlert) {
        mHelperOnJsAlert = helperOnJsAlert;
    }

    public class WebAppInterface {
        /**
         * js调用，重新加载页面
         */
        @JavascriptInterface
        public void reload() {
            mWebView.post(new Runnable() {
                @Override
                public void run() {
                    //LogUtil.d(url);
                    loadUrl(url);
                }
            });

        }
    }

    public void setNeedCheckNet(boolean needCheckNet) {
        isNeedCheckNet = needCheckNet;
    }
}
